package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Time;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.BitacoraUnidadDAO;
import mx.ipn.persistencia.dao.UnidadDAO;
import mx.ipn.persistencia.dao.BaseDAO;
import mx.ipn.persistencia.dao.MotivoDAO;
import mx.ipn.persistencia.dao.UsuarioDAO;
import mx.ipn.to.BitacoraUnidadTO;
import mx.ipn.to.UnidadTO;
import mx.ipn.to.BaseTO;
import mx.ipn.to.MotivoTO;
import mx.ipn.to.UsuarioTO;
import mx.ipn.to.FechaHoraTO;

public class BitacoraUnidadDAOMySQL implements BitacoraUnidadDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(BitacoraUnidadDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO bitacora_unidad (fecha,hora,id_unidad,id_base,id_usuario,id_motivo,activo) VALUES(?,?,?,?,?,?,?)";
	private static final String UPDATE = "UPDATE bitacora_unidad SET fecha=?,hora=?,id_unidad=?,id_base=?,id_usuario=?,id_motivo=?,activo=? WHERE id_operacion=?";
	private static final String ACTIVADESACTIVA = "UPDATE bitacora_unidad SET activo=? WHERE id_operacion=?";

	private static final String FINDBYID = "SELECT * FROM bitacora_unidad WHERE id_operacion=?";

	private static final String SELECT = "SELECT * FROM bitacora_unidad";
	private static final String SELECTACTIVO = "SELECT * FROM bitacora_unidad WHERE activo=true";
	private static final String SELECTBYRANGOFECHAHORA = "SELECT * FROM bitacora_unidad WHERE fecha>=? AND fecha<=? AND hora>=? AND hora<=?";

	private static final String SELECTBYUNIDADACTIVO = "SELECT * FROM bitacora_unidad WHERE fecha>=? AND fecha<=? AND id_unidad=? AND activo=?";
	private static final String SELECTBYBASEACTIVO = "SELECT * FROM bitacora_unidad WHERE fecha>=? AND fecha<=? AND id_base=? AND activo=?";
	private static final String SELECTBYUSUARIOACTIVO = "SELECT * FROM bitacora_unidad WHERE fecha>=? AND fecha<=? AND id_usuario=? AND activo=?";
	private static final String SELECTBYMOTIVOACTIVO = "SELECT * FROM bitacora_unidad WHERE fecha>=? AND fecha<=? AND id_motivo=? AND activo=?";
	
	private static final String SELECTBYRANGOFECHAMOTIVOUNIDADACTIVO = "SELECT * FROM bitacora_unidad WHERE fecha>=? AND fecha<=? AND id_motivo=? AND id_unidad=? AND activo=?";
	private static final String SELECTBYRANGOFECHAMOTIVOBASEACTIVO = "SELECT * FROM bitacora_unidad WHERE fecha>=? AND fecha<=? AND id_motivo=? AND id_base=? AND activo=?";
	private static final String SELECTBYRANGOFECHAMOTIVOBASEUNIDADACTIVO = "SELECT * FROM bitacora_unidad WHERE fecha>=? AND fecha<=? AND id_motivo=? AND id_base=? AND id_unidad=? AND activo=?";

	@Override
	public short activaDesactivaBitacoraUnidad(int idOperacion, boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(ACTIVADESACTIVA);
			
			ps.setBoolean(1, activa);
			ps.setInt(2, idOperacion);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public BitacoraUnidadTO findBitacoraUnidadById(int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idOperacion);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			UnidadDAO unidadDAO = fabricaMySQL.getUnidadDAO();
			BaseDAO baseDAO = fabricaMySQL.getBaseDAO();
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();
			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();

			if (rs.next()) {
				idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				java.sql.Time hora = rs.getTime("hora");

				ArrayList<UnidadTO> listUnidadTO = new ArrayList<UnidadTO>();
				ArrayList<BaseTO> listBaseTO = new ArrayList<BaseTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();
				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();

				UnidadTO unidadTO = unidadDAO.findUnidadById(rs
						.getInt("id_unidad"));
				BaseTO baseTO = baseDAO.findBaseById(rs.getInt("id_base"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));
				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));

				boolean activo = rs.getBoolean("activo");

				listUnidadTO.add(unidadTO);
				listBaseTO.add(baseTO);
				listUsuarioTO.add(usuarioTO);
				listMotivoTO.add(motivoTO);

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				
				BitacoraUnidadTO bitacoraUnidadTO = new BitacoraUnidadTO(
						idOperacion, fecha, hora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, activo);

				ps.close();
				conexion.close();
				return bitacoraUnidadTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertBitacoraUnidad(BitacoraUnidadTO bitacoraUnidadTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setDate(1, FechaHoraTO.getFecha(bitacoraUnidadTO.getFecha()));
			ps.setTime(2, FechaHoraTO.getHora(bitacoraUnidadTO.getHora()));
			ps.setInt(3, bitacoraUnidadTO.getIdUnidad());
			ps.setInt(4, bitacoraUnidadTO.getIdBase());
			ps.setInt(5, bitacoraUnidadTO.getIdUsuario());
			ps.setInt(6, bitacoraUnidadTO.getIdMotivo());
			ps.setBoolean(7, bitacoraUnidadTO.getActivo());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<BitacoraUnidadTO> selectBitacoraUnidad() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			UnidadDAO unidadDAO = fabricaMySQL.getUnidadDAO();
			BaseDAO baseDAO = fabricaMySQL.getBaseDAO();
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();
			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();

			ArrayList<BitacoraUnidadTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraUnidadTO>();

				int idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				java.sql.Time hora = rs.getTime("hora");

				ArrayList<UnidadTO> listUnidadTO = new ArrayList<UnidadTO>();
				ArrayList<BaseTO> listBaseTO = new ArrayList<BaseTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();
				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();

				UnidadTO unidadTO = unidadDAO.findUnidadById(rs
						.getInt("id_unidad"));
				BaseTO baseTO = baseDAO.findBaseById(rs.getInt("id_base"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));
				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));

				boolean activo = rs.getBoolean("activo");

				listUnidadTO.add(unidadTO);
				listBaseTO.add(baseTO);
				listUsuarioTO.add(usuarioTO);
				listMotivoTO.add(motivoTO);

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				
				BitacoraUnidadTO bitacoraUnidadTO = new BitacoraUnidadTO(
						idOperacion, fecha, hora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, activo);

				coleccion.add(bitacoraUnidadTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraUnidadTO selectByRangoFechaBaseActiva(java.sql.Date inicio,
			java.sql.Date fin, int idBase, boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		

			UnidadDAO unidadDAO = null;
			BaseDAO baseDAO = null;
			UsuarioDAO usuarioDAO = null;
			MotivoDAO motivoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<BaseTO> listBaseTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<Boolean> listActivo = null;

			BitacoraUnidadTO bitacoraUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYBASEACTIVO);

			ps.setDate(1, inicio);
			ps.setDate(2, fin);
			ps.setInt(3, idBase);
			ps.setBoolean(4, activa);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listBaseTO = new ArrayList<BaseTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					unidadDAO = fabricaMySQL.getUnidadDAO();
					baseDAO = fabricaMySQL.getBaseDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();
					motivoDAO = fabricaMySQL.getMotivoDAO();
				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));

				listUnidadTO.add(unidadDAO.findUnidadById(rs
						.getInt("id_unidad")));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listActivo.add(activa);
			}
			if (listIdOperacion != null) {
				listBaseTO.add(baseDAO.findBaseById(idBase));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				bitacoraUnidadTO = new BitacoraUnidadTO(arrIdOperacion,
						arrFecha, arrHora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, arrActivo);
			}
			ps.close();
			conexion.close();
			return bitacoraUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraUnidadTO selectByRangoFechaMotivoActivo(java.sql.Date inicio,
			java.sql.Date fin, int idMotivo,boolean activo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			

			UnidadDAO unidadDAO = null;
			BaseDAO baseDAO = null;
			UsuarioDAO usuarioDAO = null;
			MotivoDAO motivoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<BaseTO> listBaseTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<Boolean> listActivo = null;

			BitacoraUnidadTO bitacoraUnidadTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYMOTIVOACTIVO);
			ps.setDate(1, inicio);
			ps.setDate(2, fin);
			ps.setInt(3, idMotivo);
			ps.setBoolean(4, activo);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listBaseTO = new ArrayList<BaseTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					unidadDAO = fabricaMySQL.getUnidadDAO();
					baseDAO = fabricaMySQL.getBaseDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();
					motivoDAO = fabricaMySQL.getMotivoDAO();
				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));
				listUnidadTO.add(unidadDAO.findUnidadById(rs
						.getInt("id_unidad")));
				listBaseTO.add(baseDAO.findBaseById(rs.getInt("id_base")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listActivo.add(rs.getBoolean("activo"));
			}
			if (listIdOperacion != null) {
				listMotivoTO.add(motivoDAO.findMotivoById(idMotivo));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				bitacoraUnidadTO = new BitacoraUnidadTO(arrIdOperacion,
						arrFecha, arrHora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, arrActivo);
			}
			ps.close();
			conexion.close();
			return bitacoraUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraUnidadTO> selectByRangoFechaHora(Date inicioFecha,
			Date finFecha, Time inicioHora, Time finHora) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAHORA);

			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setTime(3, inicioHora);
			ps.setTime(4, finHora);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			UnidadDAO unidadDAO = fabricaMySQL.getUnidadDAO();
			BaseDAO baseDAO = fabricaMySQL.getBaseDAO();
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();
			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();

			ArrayList<BitacoraUnidadTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraUnidadTO>();

				int idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				java.sql.Time hora = rs.getTime("hora");

				ArrayList<UnidadTO> listUnidadTO = new ArrayList<UnidadTO>();
				ArrayList<BaseTO> listBaseTO = new ArrayList<BaseTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();
				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();

				UnidadTO unidadTO = unidadDAO.findUnidadById(rs
						.getInt("id_unidad"));
				BaseTO baseTO = baseDAO.findBaseById(rs.getInt("id_base"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));
				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));

				boolean activo = rs.getBoolean("activo");

				listUnidadTO.add(unidadTO);
				listBaseTO.add(baseTO);
				listUsuarioTO.add(usuarioTO);
				listMotivoTO.add(motivoTO);

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				
				BitacoraUnidadTO bitacoraUnidadTO = new BitacoraUnidadTO(
						idOperacion, fecha, hora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, activo);

				coleccion.add(bitacoraUnidadTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraUnidadTO selectByRangoFechaMotivoBaseActivo(int idMotivo,
			int idBase, Date inicioFecha, Date finFecha, boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			

			UnidadDAO unidadDAO = null;
			BaseDAO baseDAO = null;
			UsuarioDAO usuarioDAO = null;
			MotivoDAO motivoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<BaseTO> listBaseTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<Boolean> listActivo = null;

			BitacoraUnidadTO bitacoraUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAMOTIVOBASEACTIVO);

			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idMotivo);
			ps.setInt(4, idBase);
			ps.setBoolean(5, activa);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listBaseTO = new ArrayList<BaseTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					unidadDAO = fabricaMySQL.getUnidadDAO();
					baseDAO = fabricaMySQL.getBaseDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();
					motivoDAO = fabricaMySQL.getMotivoDAO();
				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));

				listUnidadTO.add(unidadDAO.findUnidadById(rs
						.getInt("id_unidad")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listActivo.add(activa);
			}
			if (listIdOperacion != null) {
				listMotivoTO.add(motivoDAO.findMotivoById(idMotivo));
				listBaseTO.add(baseDAO.findBaseById(idBase));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				bitacoraUnidadTO = new BitacoraUnidadTO(arrIdOperacion,
						arrFecha, arrHora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, arrActivo);
			}
			ps.close();
			conexion.close();
			return bitacoraUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraUnidadTO selectByRangoFechaMotivoBaseUnidadActivo(
			int idMotivo, int idBase, int idUnidad, Date inicioFecha,
			Date finFecha, boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			

			UnidadDAO unidadDAO = null;
			BaseDAO baseDAO = null;
			UsuarioDAO usuarioDAO = null;
			MotivoDAO motivoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<BaseTO> listBaseTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<Boolean> listActivo = null;

			BitacoraUnidadTO bitacoraUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAMOTIVOBASEUNIDADACTIVO);

			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idMotivo);
			ps.setInt(4, idBase);
			ps.setInt(5, idUnidad);
			ps.setBoolean(6, activa);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listBaseTO = new ArrayList<BaseTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					unidadDAO = fabricaMySQL.getUnidadDAO();
					baseDAO = fabricaMySQL.getBaseDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();
					motivoDAO = fabricaMySQL.getMotivoDAO();
				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));

				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listActivo.add(activa);
			}
			if (listIdOperacion != null) {
				listMotivoTO.add(motivoDAO.findMotivoById(idMotivo));
				listBaseTO.add(baseDAO.findBaseById(idBase));
				listUnidadTO.add(unidadDAO.findUnidadById(idUnidad));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				bitacoraUnidadTO = new BitacoraUnidadTO(arrIdOperacion,
						arrFecha, arrHora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, arrActivo);
			}
			ps.close();
			conexion.close();
			return bitacoraUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraUnidadTO selectByRangoFechaMotivoUnidadActivo(int idMotivo,
			int idUnidad, Date inicioFecha, Date finFecha, boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;

			UnidadDAO unidadDAO = null;
			BaseDAO baseDAO = null;
			UsuarioDAO usuarioDAO = null;
			MotivoDAO motivoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<BaseTO> listBaseTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<Boolean> listActivo = null;

			BitacoraUnidadTO bitacoraUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAMOTIVOUNIDADACTIVO);

			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idMotivo);
			ps.setInt(4, idUnidad);
			ps.setBoolean(5, activa);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listBaseTO = new ArrayList<BaseTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					unidadDAO = fabricaMySQL.getUnidadDAO();
					baseDAO = fabricaMySQL.getBaseDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();
					motivoDAO = fabricaMySQL.getMotivoDAO();
				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));

				listBaseTO.add(baseDAO.findBaseById(rs.getInt("id_base")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listActivo.add(activa);
			}
			if (listIdOperacion != null) {
				listMotivoTO.add(motivoDAO.findMotivoById(idMotivo));
				listUnidadTO.add(unidadDAO.findUnidadById(idUnidad));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				bitacoraUnidadTO = new BitacoraUnidadTO(arrIdOperacion,
						arrFecha, arrHora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, arrActivo);
			}
			ps.close();
			conexion.close();
			return bitacoraUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraUnidadTO selectByRangoFechaUnidadActiva(
			java.sql.Date inicio, java.sql.Date fin, int idUnidad,
			boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		

			UnidadDAO unidadDAO = null;
			BaseDAO baseDAO = null;
			UsuarioDAO usuarioDAO = null;
			MotivoDAO motivoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<BaseTO> listBaseTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<Boolean> listActivo = null;

			BitacoraUnidadTO bitacoraUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYUNIDADACTIVO);

			ps.setDate(1, inicio);
			ps.setDate(2, fin);
			ps.setInt(3, idUnidad);
			ps.setBoolean(4, activa);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listBaseTO = new ArrayList<BaseTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					unidadDAO = fabricaMySQL.getUnidadDAO();
					baseDAO = fabricaMySQL.getBaseDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();
					motivoDAO = fabricaMySQL.getMotivoDAO();
				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));

				listBaseTO.add(baseDAO.findBaseById(rs.getInt("id_base")));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listActivo.add(activa);
			}
			if (listIdOperacion != null) {
				listUnidadTO.add(unidadDAO.findUnidadById(idUnidad));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				bitacoraUnidadTO = new BitacoraUnidadTO(arrIdOperacion,
						arrFecha, arrHora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, arrActivo);
			}
			ps.close();
			conexion.close();
			return bitacoraUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraUnidadTO selectByRangoFechaUsuarioActiva(
			java.sql.Date inicio, java.sql.Date fin, int idUsuario,
			boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			

			UnidadDAO unidadDAO = null;
			BaseDAO baseDAO = null;
			UsuarioDAO usuarioDAO = null;
			MotivoDAO motivoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<BaseTO> listBaseTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<Boolean> listActivo = null;

			BitacoraUnidadTO bitacoraUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYUSUARIOACTIVO);

			ps.setDate(1, inicio);
			ps.setDate(2, fin);
			ps.setInt(3, idUsuario);
			ps.setBoolean(4, activa);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listBaseTO = new ArrayList<BaseTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					unidadDAO = fabricaMySQL.getUnidadDAO();
					baseDAO = fabricaMySQL.getBaseDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();
					motivoDAO = fabricaMySQL.getMotivoDAO();
				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));

				listBaseTO.add(baseDAO.findBaseById(rs.getInt("id_base")));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
				listUnidadTO.add(unidadDAO.findUnidadById(rs
						.getInt("id_unidad")));
				listActivo.add(activa);
			}
			if (listIdOperacion != null) {
				listUsuarioTO.add(usuarioDAO.findUsuarioById(idUsuario));
				
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				bitacoraUnidadTO = new BitacoraUnidadTO(arrIdOperacion,
						arrFecha, arrHora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, arrActivo);
			}
			ps.close();
			conexion.close();
			return bitacoraUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateBitacoraUnidad(BitacoraUnidadTO bitacoraUnidadTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);
			
			ps.setDate(1, FechaHoraTO.getFecha(bitacoraUnidadTO.getFecha()));
			ps.setTime(2, FechaHoraTO.getHora(bitacoraUnidadTO.getHora()));
			ps.setInt(3, bitacoraUnidadTO.getIdUnidad());
			ps.setInt(4, bitacoraUnidadTO.getIdBase());
			ps.setInt(5, bitacoraUnidadTO.getIdUsuario());
			ps.setInt(6, bitacoraUnidadTO.getIdMotivo());
			ps.setBoolean(7, bitacoraUnidadTO.getActivo());
			ps.setInt(8, bitacoraUnidadTO.getIdOperacion());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public ArrayList<BitacoraUnidadTO> selectBitacoraUnidadActivo() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTACTIVO);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			UnidadDAO unidadDAO = fabricaMySQL.getUnidadDAO();
			BaseDAO baseDAO = fabricaMySQL.getBaseDAO();
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();
			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();

			ArrayList<BitacoraUnidadTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraUnidadTO>();

				int idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				java.sql.Time hora = rs.getTime("hora");

				ArrayList<UnidadTO> listUnidadTO = new ArrayList<UnidadTO>();
				ArrayList<BaseTO> listBaseTO = new ArrayList<BaseTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();
				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();

				UnidadTO unidadTO = unidadDAO.findUnidadById(rs
						.getInt("id_unidad"));
				BaseTO baseTO = baseDAO.findBaseById(rs.getInt("id_base"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));
				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));

				boolean activo = rs.getBoolean("activo");

				listUnidadTO.add(unidadTO);
				listBaseTO.add(baseTO);
				listUsuarioTO.add(usuarioTO);
				listMotivoTO.add(motivoTO);

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				BaseTO[] arrBaseTO = (BaseTO[])listBaseTO.toArray(new BaseTO[listBaseTO.size()]);				
				
				BitacoraUnidadTO bitacoraUnidadTO = new BitacoraUnidadTO(
						idOperacion, fecha, hora, arrUnidadTO, arrBaseTO,
						arrUsuarioTO, arrMotivoTO, activo);

				coleccion.add(bitacoraUnidadTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

}
